/****************************
    日期：2023年6月28日
    编辑者：yanqisui

    CHV30 一线串口测试程序
    功 能 ：
            1.指定音频播放
            2.指定音频循环播放
            3.指定音频组合播放
            4.低功耗模式
            5.唤醒模式
*****************************/
#define Date_Pin  5

void setup() {

  pinMode(Date_Pin, OUTPUT);
  digitalWrite(Date_Pin, HIGH);
  Serial.begin(115200);
  delay(1000);
  Serial.println("Test Begin!");

  Loop_Play(0x01);
  Serial.println("Play 0x01 Voice");
  delay(5000);
  Serial.println("CHV30 Stop!");
  Stop_Play();
  digitalWrite(Date_Pin, HIGH);



}


void loop() {

}


/**********************************************
 -函数说明：按照指定地址播放音频
 -参数说明：dat表示指定的音频地址
 -返回说明：无
 -备注：无
**********************************************/
void oneWrite_date(unsigned char dat){

  int i = 0;
  digitalWrite(Date_Pin, LOW);
  delay(6);
  for(i = 0;i < 8;i++){

    if(dat&0x01){

    digitalWrite(Date_Pin, HIGH);
    delayMicroseconds(600);
    digitalWrite(Date_Pin, LOW);
    delayMicroseconds(200);

    }else{

    digitalWrite(Date_Pin, HIGH);
    delayMicroseconds(200);
    digitalWrite(Date_Pin, LOW);
    delayMicroseconds(600);
 
    }

    dat = dat>>1;
    
  }
  
  digitalWrite(Date_Pin, HIGH);
}


/**********************************************
 -函数说明：循环指定音频的播放。
 -参数说明：dat表示指定的音频地址，如第一个音频 0x01
 -返回说明：无
 -备注：无
**********************************************/
void Loop_Play(unsigned char dat)
{
   oneWrite_date(dat);
   delay(20);
   oneWrite_date(0xF2);
   delay(20);

}


/**********************************************
 -函数说明：组合播放第一段、第二段、第三段声音，依次按照顺序播放。
 -参数说明：无
 -返回说明：无
 -备注：在组合播放的过程中，接收到新的组合播放数据，会停止当前的组合播放，转去播放新的指令。
**********************************************/
void Combo_Play(unsigned char dat0,unsigned char dat1,unsigned char dat2){


   oneWrite_date(0xF3);
   delay(20);
   oneWrite_date(dat0);
   delay(25);
   oneWrite_date(dat1);
   delay(25);
   oneWrite_date(dat2);
   delay(25);
}


/**********************************************
 -函数说明：停止当前正在播放的音频。
 -参数说明：0xFE代表暂定指令
 -返回说明：无
 -备注：无
**********************************************/
void Stop_Play(){

  oneWrite_date(0xFE);

}


/**********************************************
 -函数说明：使芯片进入低功耗模式。
 -参数说明：0xF0代表暂定指令
 -返回说明：无
 -备注：无
**********************************************/
void Sleep_Mode(){

  oneWrite_date(0xF0);

}


/**********************************************
 -函数说明：芯片唤醒函数，从低功耗模式中唤醒。
 -参数说明：无
 -返回说明：无
 -备注：无
**********************************************/
void Wakeup_Mode(){

  digitalWrite(Date_Pin, LOW);
  delay(40);
  digitalWrite(Date_Pin, HIGH);
  delay(15);

}